package aceim.app.view.page.history; import java.util.ArrayList; import java.util.Collections; import java.util.List; import aceim.api.dataentity.Buddy; import aceim.api.dataentity.Message; import aceim.api.dataentity.MessageAckState; import aceim.api.utils.Logger; import aceim.app.MainActivity; import aceim.app.R; import aceim.app.dataentity.Account; import aceim.app.dataentity.listeners.IHasBuddy; import aceim.app.dataentity.listeners.IHasMessages; import aceim.app.service.ServiceUtils; import aceim.app.utils.ViewUtils; import aceim.app.view.page.Page; import aceim.app.view.page.chat.ChatMessageHolder; import aceim.app.widgets.adapters.MessagesAdapter; import aceim.app.widgets.bottombar.BottomBarButton; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.os.RemoteException; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; public class History extends Page implements IHasMessages, IHasBuddy { private static final String SAVE_PARAM_MESSAGES = "messages"; private static final String SAVE_PARAM_FROM = "startFrom"; private static final int MAX_MESSAGES_PER_READ = 25; private final Buddy mBuddy; private final ArrayList<ChatMessageHolder> mMessageHolders = new ArrayList<ChatMessageHolder>(25); private MessagesAdapter mMessageAdapter; private SwipeRefreshLayout mSwiper; private ListView mMessages; private BottomBarButton mDeleteBtn; private BottomBarButton mExportBtn; private BottomBarButton mCopyBtn; private BottomBarButton mCancelBtn; private int startFrom = 0; private final OnClickListener mDeleteClickListener = new OnClickListener() { @Override public void onClick(View v) { createConfirmDeleteDialog(); } }; private final OnRefreshListener mRefreshListener = new OnRefreshListener() { @Override public void onRefresh() { mSwiper.setRefreshing(true); getStoredMessagesAsync(); } }; private final OnItemLongClickListener mItemLongClickListener = new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { copyMode(view); return false; } }; private final OnClickListener mCopyClickListener = new OnClickListener() { @Override public void onClick(View v) { String selectedText = mMessageAdapter.grabSelectedText(mMessages); ServiceUtils.toClipboard(getMainActivity(),selectedText, getMainActivity().getString(R.string.default_key_value_format, getTitle(getMainActivity()), mBuddy.getSafeName())); readWriteMode(); ViewUtils.showInformationToast(getMainActivity(), android.R.drawable.ic_menu_agenda, R.string.copied_to_clipboard, null); } }; private final OnClickListener mCancelCopyListener = new OnClickListener() { @Override public void onClick(View v) { readWriteMode(); } }; public History(Buddy buddy) { this.mBuddy = buddy; } private void getStoredMessagesAsync() { AsyncTask<Void, Void, List<ChatMessageHolder>> messagesGetter = new AsyncTask<Void, Void, List<ChatMessageHolder>>() { @Override protected List<ChatMessageHolder> doInBackground(Void... params) { return getStoredMessages(); } @Override protected void onPostExecute(List<ChatMessageHolder> messages){ for (int i=messages.size()-1; i>=0; i--) { ChatMessageHolder holder = messages.get(i); mMessageAdapter.insert(holder, 0); } mSwiper.setRefreshing(false); } }; messagesGetter.execute(); } @Override public View createView(LayoutInflater inflater, ViewGroup group, Bundle saved){ View view = inflater.inflate(R.layout.history, group, false); mMessages = (ListView) view.findViewById(R.id.messages); mSwiper = (SwipeRefreshLayout) view.findViewById(R.id.refresh); mDeleteBtn = (BottomBarButton) view.findViewById(R.id.delete); mExportBtn = (BottomBarButton) view.findViewById(R.id.export); mCopyBtn = (BottomBarButton) view.findViewById(R.id.copy); mCancelBtn = (BottomBarButton) view.findViewById(R.id.cancel); if (mMessageAdapter == null) { MainActivity activity = getMainActivity(); try { Account a = activity.getCoreService().getAccount(mBuddy.getServiceId()); mMessageAdapter = new MessagesAdapter(activity, a, mBuddy, activity.getThemesManager().getViewResources().getHistoryMessageItemLayout(), mMessageHolders); } catch (RemoteException e) { Logger.log(e); } } mMessages.setAdapter(mMessageAdapter); mMessages.setOnItemLongClickListener(mItemLongClickListener); mSwiper.setOnRefreshListener(mRefreshListener); mSwiper.setColorScheme(R.color.chat_message_sender_color_sent, R.color.chat_message_sender_color_received, R.color.chat_message_sender_color_service, R.color.transparent); mExportBtn.setVisibility(View.GONE); initClickListeners(); recoverFromStoredData(saved); return view; } private void initClickListeners() { mDeleteBtn.setOnClickListener(mDeleteClickListener); mCopyBtn.setOnClickListener(mCopyClickListener); mCancelBtn.setOnClickListener(mCancelCopyListener); } private List<ChatMessageHolder> getStoredMessages() { List<ChatMessageHolder> messageHolders; try { List<Message> messages = getMainActivity().getCoreService().getMessages(mBuddy, startFrom, MAX_MESSAGES_PER_READ); messageHolders = new ArrayList<ChatMessageHolder>(messages.size()); Account account = getMainActivity().getCoreService().getAccount(mBuddy.getServiceId()); messageHolders.addAll(ViewUtils.wrapMessages(mBuddy, account, messages)); startFrom += MAX_MESSAGES_PER_READ; } catch (RemoteException e) { getMainActivity().onRemoteException(e); messageHolders = Collections.emptyList(); } return messageHolders; } @Override public void onSaveInstanceState(Bundle saver){ saver.putParcelableArrayList(SAVE_PARAM_MESSAGES, mMessageHolders); saver.putInt(SAVE_PARAM_FROM, startFrom); } @Override public Bundle getPageDataForStorage(){ Bundle saver = new Bundle(); onSaveInstanceState(saver); return saver; } private void recoverFromStoredData(Bundle saved){ if (mMessageHolders.size() > 0) { return; } if (saved != null && saved.containsKey(SAVE_PARAM_MESSAGES)) { startFrom = saved.getInt(SAVE_PARAM_FROM); List<ChatMessageHolder> result = saved.getParcelableArrayList(SAVE_PARAM_MESSAGES); mMessageHolders.addAll(result); } else if (mMessageHolders.size() < 1) { getStoredMessagesAsync(); } } @Override public Drawable getIcon(Context context) { return context.getResources().getDrawable(android.R.drawable.ic_menu_recent_history); } @Override public String getTitle(Context context) { return context.getString(R.string.history_header, mBuddy.getSafeName()); } @Override public void onMessageReceived(Message message) { if (!hasMessagesOfBuddy(message.getServiceId(), message.getContactUid())) { return; } mMessageAdapter.add(new ChatMessageHolder(message, mBuddy.getSafeName())); if (getMainActivity().getScreen().getSelectedPage() == this) { ViewUtils.showAlertToast(getMainActivity(), R.drawable.ic_message, R.string.new_message_added, null); } } @Override public void onMessageAckReceived(long messageId, MessageAckState ack) {} @Override public boolean hasMessagesOfBuddy(byte serviceId, String buddyProtocolUid) { return serviceId == mBuddy.getServiceId() && buddyProtocolUid.equals(mBuddy.getProtocolUid()); } @Override public void onBuddyStateChanged(List<Buddy> buddy) {} @Override public Buddy getBuddy() { return mBuddy; } @Override public void onBuddyIcon(byte serviceId, String protocolUid) {} @Override public boolean hasThisBuddy(byte serviceId, String protocolUid) { return serviceId == mBuddy.getServiceId() && protocolUid.equals(mBuddy.getProtocolUid()); } private void createConfirmDeleteDialog() { final MainActivity activity = getMainActivity(); AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setCancelable(true) .setIcon(getIcon(activity)) .setTitle(getTitle(activity)) .setMessage(R.string.confirm_delete_history) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { boolean result = false; try { result = activity.getCoreService().deleteMessagesHistory(mBuddy); } catch (RemoteException e) { activity.onRemoteException(e); } if (result) { mMessageAdapter.clear(); } dialog.dismiss(); } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } private void copyMode(View starter) { mMessageAdapter.setCopyMode(true, starter); mDeleteBtn.setVisibility(View.GONE); mCopyBtn.setVisibility(View.VISIBLE); mCancelBtn.setVisibility(View.VISIBLE); } private void readWriteMode() { mMessageAdapter.setCopyMode(false, null); mDeleteBtn.setVisibility(View.VISIBLE); mCopyBtn.setVisibility(View.GONE); mCancelBtn.setVisibility(View.GONE); } }